
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>如果让你设计一个 RPC 框架，如何设计？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>如果让你设计一个 RPC 框架，如何设计？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">一个高效的RPC框架在整体架构设计上应包含哪四个核心组成部分？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">RPC框架的四个核心组成部分是：客户端和服务端、通信协议、序列化/反序列化、以及服务注册与发现。</div>
          </div>
          <div class="card-source">来源: 1. 整体架构设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中推荐采用HTTP/2作为通信协议，其主要优势体现在哪三个方面？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">采用HTTP/2协议的主要优势是它支持双向流、头部压缩和多路复用，这些特性可以显著提高传输效率。</div>
          </div>
          <div class="card-source">来源: 2.1 通信层设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在多种序列化方案中，为什么Protobuf被视为大规模分布式系统的首选？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Protobuf被视为首选，因为它具有高效、紧凑的特点，适合在网络中传输大量数据。</div>
          </div>
          <div class="card-source">来源: 2.2 序列化/反序列化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在服务注册与发现机制中，客户端如何应对注册中心不可用或响应延迟的情况，以保证服务调用的稳定性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">客户端通过缓存服务实例信息来应对此问题。当注册中心不可用或有延迟时，客户端可以利用本地缓存的服务列表继续进行调用。</div>
          </div>
          <div class="card-source">来源: 2.3 服务注册与发现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">什么是服务治理中的“熔断机制”，它主要解决了什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">熔断机制是指当检测到某个服务调用的失败率过高时，会短暂地关闭对该服务的调用入口。它主要为了防止因局部故障蔓延导致的整个系统“雪崩效应”。</div>
          </div>
          <div class="card-source">来源: 2.5 服务治理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当RPC调用失败时，框架应提供什么样的故障转移机制来提高服务的可用性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">框架应提供自动故障转移机制，当调用失败时，自动切换到其他可用的服务实例。同时，该机制还应支持配置重试次数和间隔的多次重试功能。</div>
          </div>
          <div class="card-source">来源: 2.4 负载均衡与故障转移</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">为了提升RPC框架在高并发场景下的处理能力，文档推荐了哪种I/O模型？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐使用异步非阻塞 IO（例如使用 Netty），以有效提升系统在高并发场景下的并发处理能力。</div>
          </div>
          <div class="card-source">来源: 3. 性能优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为了让RPC框架具有良好的扩展性，允许开发者自定义功能（如新增序列化或负载均衡策略），应该采用什么样的设计模式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">应该设计插件机制（Plugin Mechanism），这种模式允许开发者方便地自定义和扩展框架的核心功能，而无需修改框架源码。</div>
          </div>
          <div class="card-source">来源: 4. 扩展性设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">文档中提到了哪三种关键的服务治理功能来保障系统的稳定性和防止服务过载？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">三种关键的服务治理功能是：1. 熔断机制，防止雪崩效应；2. 限流，控制单个服务的最大请求数以防止过载；3. 降级处理，在依赖服务不可用时返回预设结果。</div>
          </div>
          <div class="card-source">来源: 2.5 服务治理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
